'''
9.2 异常捕获语句
'''
'''
9.2.1 使用try--except语句捕获异常
try--except语句的语法格式如下:
try:
    可能出错的代码
except [异常类型 [as error]]:  # 将捕获到的异常对象赋值给error
    捕获异常后的处理代码
'''
'''
    try-except语句执行的过程为:优先执行try子句中可能出错的代码.若try子句中没有出现异常,忽略except子句继续向下执行;若try子句中出现异常,
忽略try子句的剩余代码,转而执行except子句:若程序出现的异常类型与except子句中指定的异常类型匹配,使用error记录异常信息,执行except子句中的代码,
否则按系统默认的方式终止程序
    try-except语句可以捕获与处理程序的单个,多个或全部异常
'''

# 1.捕获单个异常
# num_one = int(input('请输入被除数:'))
# num_two = int(input('请输入除数:'))
# try:
#     print('结果为',num_one / num_two)
# except ZeroDivisionError:
#     print('出错了')
# print('----分割线----')
'''
    以上代码在try子句中捕获2个整数相除可能出现的异常,由于变量num_two有不确定性,可能会导致程序引发ZeroDivisionError异常;except子句中明确
指定捕获ZeroDivisionError异常,故程序只有捕获到ZeroDivisionError异常后才会执行except子句的打印语句
    以上示例的输出结果仅仅表明出现了错误,但没有明确地说明该异常产生的具体原因.这里可以在异常类型之后使用as关键字来获取异常的具体信息,修改后的代码如下:
'''
# num_one = int(input('请输入被除数:'))
# num_two = int(input('请输入除数:'))
# try:
#     print('结果为',num_one / num_two)
# except ZeroDivisionError as error:
#     print('出错了',error)
# print('----分割线----')

# 2.捕获多个异常
# 捕获多个异常需要再except之后以元组形式指定多了异常类型,示例代码如下:
# try:
#     num_one = int(input('请输入被除数'))
#     num_two = int(input('请输入除数'))
#     print('结果为',num_one / num_two)
# except (ZeroDivisionError,ValueError) as error:
#     print('出错了',error)
# print('----分割线----')
# 由2次输出的结果可知,程序可以成功捕获ZeroDivisionError或者ValueError异常

# 3.捕获全部异常
# 如果要捕获程序中所有的异常,那么可以将except之后的异常类型设置为Exception或省略不写.需要注意的是,若省略异常类型,except子句中无法获取异常的具体信息
# try:
#     num_one = int(input('请输入被除数'))
#     num_two = int(input('请输入除数'))
#     print('结果为',num_one / num_two)
# except Exception as error:
#     print('出错了',error)
# print('----分割线----')

# 9.2.2 异常结构中的else子句
# else子句可以与try-except语句组合成try-except-else结构,若try监控的代码没有异常,程序会执行else子句后的代码.try-except-else结构的语法格式如下:
# try:
#     可能出错的代码
# except 异常类型 as error:
#     捕获异常后的处理代码
# else:
#     没有异常的处理代码
# 例如,执行除法运算时,分别使用try-except语句和else子句,处理除数为0和非0的情况,示例代码如下:
try:
    first_num = int(input('请输入被除数'))
    second_num = int(input('请输入除数'))
    res = first_num/second_num
except Exception as error:
    print('出错了',error)
else:
    print(res)
print('----分割线----')

# 9.2.3 异常结构中的finally子句
# finally子句可以与try-except一起使用,语法格式如下:
# try:
#     可能出错的代码
# except 异常类型 as error:
#     捕获异常后的代码处理
# finally:
#     一定执行的代码
# 无论try子句监控的代码是否产生异常,finally子句都会被执行,基于此特性,在实际应用程序中,finally子句多用于预设资源的清理操作,如关闭文件,关闭网络连接
# 关闭数据库连接等

